// const { ccclass, property } = cc._decorator;

// @ccclass
// export default class CCGraphicsMask extends cc.Mask {
//     @property({
//         type: cc.Enum({
//             RECT: 0,
//             ELLIPSE: 1,
//             IMAGE_STENCIL: 2,
//             GRAPHICS_STENCIL: 3
//         }),
//         override: true
//     })
//     type = 0;

//     @property({
//         type: cc.Node,
//         tooltip: "剔除该Node的所有子节点"
//     })
//     excludeNodeRoot = null;

//     @property({
//         type: cc.Node,
//         tooltip: "剔除该列表中的Node"
//     })
//     excludeNodes = [];

//     onLoad() {
//         this.excludeNodeRoot && this._checkExcludeNodes(this.excludeNodeRoot.children);
//         this._checkExcludeNodes(this.excludeNodes);
//         this._bindExcludeNodes(this.excludeNodes);
//         this._updatePolygon();
//     }

//     _checkExcludeNodes(nodes) {
//         for (let i = 0; i < nodes.length; i++) {
//             let node = nodes[i];
//             if (node) {
//                 let name = node.name;
//                 if (!name || name.trim() === "") {
//                     name = "default";
//                 }
//                 let polygonCollider = node.getComponent(cc.PolygonCollider);
//                 if (polygonCollider) {
//                     this._addPolygon(name, polygonCollider.points);
//                 } else if (node && node.width !== 0 && node.height !== 0 && node.scaleX !== 0 && node.scaleY !== 0) {
//                     let width = node.width * node.scaleX;
//                     let height = node.height * node.scaleY;
//                     let x = node.x - width * node.anchorX;
//                     let y = node.y - height * node.anchorY;
//                     this._addPolygon(name, [
//                         cc.v2(x, y),
//                         cc.v2(x + width, y),
//                         cc.v2(x + width, y + height),
//                         cc.v2(x, y + height)
//                     ]);
//                 }
//             }
//         }
//     }

//     _bindExcludeNodes(nodes) {
//         for (let i = 0; i < nodes.length; i++) {
//             let node = nodes[i];
//             if (node) {
//                 let name = node.name;
//                 if (!name || name.trim() === "") {
//                     name = "default";
//                 }
//                 let excludeNodes = this._excludeNodeMap.get(name);
//                 if (!excludeNodes) {
//                     excludeNodes = [];
//                 }
//                 excludeNodes.push(node);
//                 this._excludeNodeMap.set(name, excludeNodes);
//             }
//         }
//     }

//     public _polygonMap;
//     _addPolygon(name = "default", points = []) {
//         if (points && points.length) {
//             let polygons = this._polygonMap.get(name);
//             if (!polygons) {
//                 polygons = [];
//             }
//             polygons.push(...points, points[0]);
//             if (polygons.length > points.length + 1) {
//                 polygons.push(polygons[0]);
//             }
//             this._polygonMap.set(name, polygons);
//         }
//     }

//     _updatePolygon() {
//         if (this.type === 3) {
//             this._drawPolygon();
//         }
//     }

//     _hitTest() {
//         return true;
//     }

//     _updateGraphics() {
//         if (this.type === 3) {
//             this._drawPolygon();
//         } else {
//             super._updateGraphics();
//         }
//     }

//     _drawPolygon() {
//         if (this.type === 3) {
//             let graphics = this._graphics;
//             if (!graphics) {
//                 this._createGraphics();
//                 graphics = this._graphics;
//             }
//             graphics.clear(false);
//             for (let [key, value] of this._polygonMap.entries()) {
//                 let excludeNodes = this._excludeNodeMap.get(key);
//                 if (value.length && (key === "default" || this._showKeys.get(key))) {
//                     graphics.moveTo(value[0].x, value[0].y);
//                     for (let i = 1; i < value.length; i++) {
//                         graphics.lineTo(value[i].x, value[i].y);
//                     }
//                     graphics.close();
//                     if (excludeNodes && excludeNodes.length) {
//                         for (let j = 0; j < excludeNodes.length; j++) {
//                             excludeNodes[j].active = true;
//                         }
//                     }
//                 } else if (excludeNodes && excludeNodes.length) {
//                     for (let j = 0; j < excludeNodes.length; j++) {
//                         excludeNodes[j].active = false;
//                     }
//                 }
//             }
//             if (cc.game.renderType === cc.game.RENDER_TYPE_CANVAS) {
//                 graphics.stroke();
//             } else {
//                 graphics.fill();
//             }
//         }
//     }

//     showPolygon(key) {
//         this._showKeys.set(key, true);
//         this._updatePolygon();
//     }

//     hidePolygon(key) {
//         this._showKeys.set(key, false);
//         this._updatePolygon();
//     }
//     public _showKeys;
//     public _excludeNodeMap;

//     addPolygon(key, node, points) {
//         let polygons = [];

//         for (let i in points) {
//             polygons.push(points[i].add(node));
//         }
//         this._addPolygon(key, polygons);
//         if (key === "default" || this._showKeys.get(key)) {
//             this._updatePolygon();
//         }
//     }

// }